<html>
    <head>
        <title>动态JavaScript Api 客户端代理</title>
    </head>
    <body>
        <script>
            // 动态JavaScript Api 客户端代理

                    /*
                          通常从JavaScript代码中访问 HTTP API。

                          为此，你通常要处理低级的ajax请求，例如$. ajax或更好的abp.ajax。

                          ABP提供了一种更好的从JavaScript代码调用 Http Api 的方法：  JavaScript Api 客户端代理。

                    */

                    /*
                        一、 "静态" 与 "动态"  JavaScript客户端代理

                                      ABP提供了两种类型的客户端代理生成系统。

                                      本文档解释了动态客户端代理，它在运行时生成客户端代理。

                                      您还可以查看 "静态JavaScript API客户端代理" 文档以了解如何在"开发时"生成代理。


                                      开发时（静态）客户端代理生成有一点性能优势，因为它不需要在运行时获取HTTP API定义

                                      但是，每当您更改API端点定义时，您应该重新生成客户端代理代码。另一方面，动态客户端代理是在运行时生成的，它提供了更简单的开发体验。
                    */


                    /*
                        二、一个简单的例子

                                    假设您有一个定义如下所示的应用程序服务：

                                            using System;
                                            using System.Threading.Tasks;
                                            using Volo.Abp.Application.Dtos;
                                            using Volo.Abp.Application.Services;

                                            namespace Acme.BookStore.Authors  
                                            {
                                                public interface IAuthorAppService : IApplicationService
                                                {
                                                    Task<AuthorDto> GetAsync(Guid id);

                                                    Task<PagedResultDto<AuthorDto>> GetListAsync(GetAuthorListDto input);

                                                    Task<AuthorDto> CreateAsync(CreateAuthorDto input);

                                                    Task UpdateAsync(Guid id, UpdateAuthorDto input);

                                                    Task DeleteAsync(Guid id);
                                                }
                                            }   
                                                
                                            
                                    您可以像调用JavaScript函数一样调用任何方法。JavaScript函数具有与C#方法相同的函数name、参数和返回值>

                                    eg:  获取作者列表

                                         acme.bookStore.authors.author.getList({
                                                                            maxResultCount: 10
                                                                        }).then(function(result){
                                                                            console.log(result.items);
                                                                        }); 
                                                                        
                                    eg: 删除坐着

                                        acme.bookStore.authors.author
                                                                .delete('7245a066-5457-4941-8aa7-3004778775f0') //Get id from somewhere!
                                                                        .then(function() {
                                                                            abp.notify.info('Successfully deleted!');
                                                                        });
                                                
                    */

                    /*
                        三、Ajax的详细信息

                                      JavaScript客户端代理函数在后台使用abp. ajax。 

                                      因此，您具有与自动错误处理相同的好处。
                                      
                                      此外，您可以通过提供选项来完全控制AJAX调用。

                                      1、返回值

                                              每个函数都返回一个Deferred对象。

                                              这意味着您可以使用then链接以获取结果，catch来处理错误，always在操作完成（成功或失败）后执行操作


                                      2、Ajax选项：

                                              每个函数在您自己的参数之后都会获得一个额外的"last参数"。

                                              最后一个参数被称为ajaxParams。它是一个"覆盖AJAX选项的对象"。

                                              eg: 设置type和dataTypeAJAX选项

                                                        acme.bookStore.authors.author
                                                                                .delete('7245a066-5457-4941-8aa7-3004778775f0', {
                                                                                    type: 'POST',
                                                                                    dataType: 'xml'
                                                                                })
                                                                                .then(function() {
                                                                                    abp.notify.info('Successfully deleted!');
                                                                                });

                                            有关所有可用选项，请参阅jQuery.ajax文档：https://api.jquery.com/jQuery.ajax/ 
                    */

                    /*
                        四、服务端代理脚本端点
                        
                                     端点：  /Abp/ServiceProxyScript 提供了一个名为 "ServiceProxyScript"的文件，此文件完成了js api的代理工作。
                                     
                                     您可以在应用程序中访问此端点以查看客户端代理函数定义。

                                     此脚本文件由ABP根据服务器端方法定义和相关的HTTP端点详细信息自动生成。
                    */
        </script>
    </body>
</html>